#include <iostream>
#include <map>
#include <fstream>
#include <sstream>
using namespace std;
//通过map来实现单词的词频采集
//map天然存储键值对，所以根据前面的vector，我只需要进行正常的流程
class Dictionary{
public:
    void read(const string& filename){
        //依旧一行一行读取
        ifstream ifs(filename);
        string line;
        while(getline(ifs,line)){
            //将读到的每一行进行分割成单个单词
            istringstream iss(line);
            string word;
            while(iss>>word){
                if(is_alpha(word)){
                    //map同样支持下标操作，但是这个下标不是普通意义的下标
                    //而是一个键，这个键是任何值都有可能.
                  //但是由于自动map的自动去重
#if 0
                    auto it1=_dict.begin();
                auto it2=_dict.end();
                while(it1!=it2){
                    if(it1->first==word){
                    ++(it1->second);
                    break;
                    }
                    ++it1;
                }
                _dict.insert({word,1});
#endif       //只需要对这个值进行++，如果没有这个键，会自动插入
             ++_dict[word];
            }
        }
    }
}

    void store(const string& filename){
        ofstream ofs(filename);
        for(auto &ele :_dict){
            ofs<<ele.first<<" "<<ele.second<<endl;
        }

    }
private:
    bool is_alpha(const string & word){
        //从开始到结束开始遍历这个word容器
        auto it1=word.begin();
        auto it2=word.end();
        while(it1!=it2){
            if(!isalpha(*it1)){
                return false;
            }
            ++it1;
        }
        return true;

    }

    map<string,int> _dict;
};
void test(){
    Dictionary dic;
    dic.read("The_Holy_Bible.txt");
    dic.store("3.txt");
}
int main(int argc, char * argv[]){
    test();
    return 0;
}

